﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;

namespace Voluntariar.WEB.Util
{
    public abstract class PaginaBase : Page
    {
        #region Atributos

        public override string StyleSheetTheme
        {
            get
            {
                if (Sessao.Contraste == "Contraste")
                    return Sessao.Contraste;
                return null;
            }
        }

        public SortDirection SortDirection
        {
            get
            {
                if (ViewState["sortDirection"] == null)
                    ViewState.Add("sortDirection", SortDirection.Ascending);

                return (SortDirection)ViewState["sortDirection"];
            }
        }
        /// <summary>
        /// Ordena Ascendente ou Descendente
        /// </summary>
        public SortDirection NextSortDirection
        {
            get
            {
                if (ViewState["sortDirection"] == null)
                    ViewState.Add("sortDirection", SortDirection.Ascending);
                else if ((SortDirection)ViewState["sortDirection"] == SortDirection.Ascending)
                    ViewState["sortDirection"] = SortDirection.Descending;
                else
                    ViewState["sortDirection"] = SortDirection.Ascending;

                return (SortDirection)ViewState["sortDirection"];
            }
            set
            {
                ViewState["sortDirection"] = value;
            }
        }
        /// <summary>
        /// Utilizada para armazenar por qual coluna a GridView foi ordenada.
        /// </summary>
        public string SortExpression
        {
            get
            {
                if (ViewState["SortExpression"] == null)
                    return null;

                return ViewState["SortExpression"].ToString();
            }
            set
            {
                ViewState["SortExpression"] = value;
            }
        }

        public bool _isRefresh
        {
            get
            {
                if (ViewState["_isRefresh"] == null)
                    return false;

                return Convert.ToBoolean(ViewState["_isRefresh"].ToString());
            }
            set
            {
                ViewState["_isRefresh"] = value;
            }
        }

        #endregion

        #region Eventos

        protected override void OnPreRender(EventArgs e)
        {
            // TODO : Verificar Acesso. 

            base.OnPreRender(e);

        }

        protected override void OnInit(EventArgs e)
        {
            CreateMetaTags();
            if (!this.ValidarAcesso())
                Response.Redirect("~/Login.aspx");

            /*BLOQUEIA PAGINA*/

            ScriptManager src = ScriptManager.GetCurrent(Page);
            if (src != null)
                ScriptManager.RegisterClientScriptBlock(this, typeof(void), "TiraDivAguarde" + Guid.NewGuid().ToString().GetHashCode().ToString("x"), "if(document.getElementById('divProcessando')) document.getElementById('divProcessando').style.display = 'none';", true);
            else
                ClientScript.RegisterStartupScript(typeof(Page), "TiraDivAguarde" + Guid.NewGuid().ToString().GetHashCode().ToString("x"), "if(document.getElementById('divProcessando')) document.getElementById('divProcessando').style.display = 'none';", true);

            ClientScript.RegisterOnSubmitStatement(this.GetType(), "zerarfiltro" + Guid.NewGuid().ToString().GetHashCode().ToString("x"), "if(document.getElementById('divProcessando') && document.getElementById('divProcessando').style.display!='none') return false;");
            //ClientScript.RegisterOnSubmitStatement(this.GetType(), "Aguarde" + Guid.NewGuid().ToString().GetHashCode().ToString("x"), "if (typeof(ValidatorOnSubmit) == 'function' && ValidatorOnSubmit() == false) return false; if(typeof(avisoAguarde) == 'function')avisoAguarde(); else{ function avisoAguarde() { if (document.getElementById('divProcessando')) { document.getElementById('divProcessando').style.display = ''; return; } oDiv = document.createElement('div'); with (oDiv) { id = 'divProcessando'; } document.body.appendChild(oDiv);} avisoAguarde();}");
            ClientScript.RegisterOnSubmitStatement(this.GetType(), "Aguarde" + Guid.NewGuid().ToString().GetHashCode().ToString("x"), "if (typeof(ValidatorOnSubmit) == 'function' && ValidatorOnSubmit() == false) return false; if(typeof(avisoAguarde) == 'function')avisoAguarde(); else{ function avisoAguarde() { if (document.getElementById('divProcessando')) { document.getElementById('divProcessando').style.display = ''; document.getElementById('divProcessando').innerHTML = 'Aguarde....'; document.getElementById('divProcessando').setAttribute('class', 'carregando'); return; } oDiv = document.createElement('div'); with (oDiv) { id = 'divProcessando'; } document.body.appendChild(oDiv); document.getElementById('divProcessando').innerHTML = 'Aguarde....'; document.getElementById('divProcessando').setAttribute('class', 'carregando'); } avisoAguarde();}");

            /*BLOQUEIA PAGINA*/

            base.OnInit(e);
        }

        protected void Page_PreInit(object sender, EventArgs e)
        {
            //Theme = "Geral";
        }

        #endregion

        #region Métodos

        private void CreateMetaTags()
        {

            HtmlMeta hm = new HtmlMeta();

            HtmlHead head = (HtmlHead)Page.Header;
            hm.HttpEquiv = "X-UA-Compatible";
            hm.Content = "IE=9; IE=8; IE=7; IE=EDGE";
            head.Controls.AddAt(0, hm);
        }

        public void TratarErro(Exception ex)
        {
            try
            {
                HtmlGenericControl objErro = (HtmlGenericControl)Page.Form.FindControl("dialogErro");
                objErro.InnerHtml = "<p>" + ex.Message.Replace("\n", "") + "</p>";
                // TODO : Log de erro.

                this.Mensagem(ex.Message);
            }
            catch
            {
                // Caso ocorra um erro aqui, não tem o que fazer 
                // uma vez que a apresentação de erro é a ultima operação do tratamento de erros
                // nesse caso eh mostrado o erro default do .net.
                throw;
            }
        }

        /// <summary>
        /// Usado por handlers que necessitem recuperar parâmetros através da URL
        /// </summary>
        /// <param name="parametro">Nome do parâmetro na url</param>
        /// <returns></returns>
        protected int RecuperarParametroInteiro(string parametro)
        {
            try
            {
                string strValor = this.RecuperarParametroString(parametro);
                if (!string.IsNullOrEmpty(strValor))
                    return int.Parse(strValor);
            }
            catch
            {
                throw new ApplicationException("Valor incorreto informado no endereço web.");
            }

            return -1;
        }
        /// <summary>
        /// Usado por handlers que necessitem recuperar parâmetros através da URL ou post.
        /// </summary>
        /// <param name="parametro">Nome do parâmetro na url ou form (post)</param>
        /// <returns></returns>
        protected string RecuperarParametroString(string parametro)
        {
            string valor = string.Empty;

            // QueryString
            if (this.Request.QueryString[parametro] != null)
                valor = this.Server.UrlDecode(this.Request.QueryString[parametro].ToString());

            // Rota
            if (this.Page.RouteData.Values[parametro] != null)
                valor = Page.RouteData.Values[parametro].ToString();

            // Form
            if (string.IsNullOrEmpty(valor))
                if (this.Request.Form[parametro] != null)
                    valor = this.Server.UrlDecode(this.Request.Form[parametro].ToString());

            return valor;
        }
        /// <summary>
        /// Emite mensagem
        /// </summary>
        /// <param name="strMensagem">Mensagem</param>
        protected void Mensagem(string mensagem)
        {
            mensagem = mensagem.Replace("\n", "\\n").Replace("\r", "\\r");
            ClientScript.RegisterClientScriptBlock(this.GetType(), "Mensagem", string.Format("alert('{0}');", mensagem), true);
        }

        private bool ValidarAcesso()
        {
            // Verifica se o usuário está logado.
            if (!Sessao.VerificarSessao())
                return false;
            //if (!(Sessao.ObjUsuario.ListaUrl).Contains(HttpContext.Current.Request.AppRelativeCurrentExecutionFilePath.ToString()))
            //    return false;
            return true;
        }

        protected void ConfiguraAbas()
        {
            string strJquery = "j('#tabs').tabs();j('#tabs').tabs('option','selected'," + Sessao.Aba + ");";
            ClientScript.RegisterStartupScript(this.GetType(), "ConfigurarAbas_" + Guid.NewGuid().ToString().GetHashCode().ToString("x"), strJquery, true);
        }

        /// <summary>
        /// Retorna o datetime no formato string dd/mm/yyyy
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public string GetData(DateTime data)
        {
            return data.ToString("dd/MM/yyyy");
        }
        /// <summary>
        /// Pega Valor de um Enum , retorna uma string.
        /// </summary>
        /// <param name="value">Enum de Retorno</param>
        /// <returns></returns>
        public string GetValor(Enum value)
        {
            // Get the type
            Type type = value.GetType();

            // Get fieldinfo for this type
            System.Reflection.FieldInfo fieldInfo = type.GetField(value.ToString());

            // Get the stringvalue attributes
            StringValue[] attribs = fieldInfo.GetCustomAttributes(typeof(StringValue), false) as StringValue[];

            // Return the first if there was a match.
            return attribs.Length > 0 ? attribs[0].ValorEnumerador : null;
        }

        /// <summary>
        /// Adiciona uma mascara a uma string como CNPJ, CPF, etc.
        /// </summary>
        /// <param name="valor"></param>
        /// <param name="mascara">Formato da mascara a ser aplicada. ex.: ###.###.###-##</param>
        /// <returns></returns>
        public static string AdicionarMascara(string valor, string mascara)
        {
            try
            {
                if (string.IsNullOrEmpty(valor))
                {
                    return "";
                }
                char[] caracteresEspeciais = mascara.Replace("#", "").ToCharArray();
                foreach (char ch in caracteresEspeciais)
                {
                    valor = valor.Replace(ch.ToString(), "");
                }
                List<char> caracteres = mascara.ToList<char>();
                List<char> valores = valor.ToList<char>();

                foreach (var item in caracteresEspeciais)
                {
                    int index = caracteres.FindIndex(p => p == item);
                    caracteres.RemoveAt(index);
                    caracteres.Insert(index, '#');
                    valores.Insert(index, item);
                }

                return new String(valores.ToArray());
            }
            catch (ArgumentNullException ex)
            {
                throw new ApplicationException("valor não pode ser nulo", ex);
            }
            catch
            {
                throw;
            }
        }

        /// <summary>
        /// Validação de um Grupo via Código
        /// </summary>
        /// <param name="group"></param>
        /// <returns></returns>
        protected bool ValidaCampos(string group)
        {
            Page.Validate(group);
            string erro = string.Empty;
            foreach (BaseValidator validator in Page.GetValidators(group))
            {
                if (!validator.IsValid)
                {
                    //throw new Exception(validator.ErrorMessage);
                    erro += validator.ErrorMessage + " \\n ";
                }
            }
            if (erro != string.Empty)
                throw new Exception(erro);
            return true;
        }

        #endregion

        protected string GetModeloSei(string nomeArquivo, bool html = true)
        {

            string caminho = Server.MapPath(@"~\Contratos\ModelosSei\");
            string conteudoTxt = string.Empty;
            nomeArquivo = caminho + nomeArquivo + ".txt";
            if (File.Exists(nomeArquivo))
            {
                conteudoTxt = File.ReadAllText(nomeArquivo, Encoding.GetEncoding("ISO-8859-1"));
            }
            if (html)
                return conteudoTxt.Replace("\n", "<br />").Replace("\r", "");
            else
                return conteudoTxt;
        }
    }
}
